package com.zjz.demo2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 等等这个类，自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {


    // 被代理的对象
    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    // 生成代理对象---Object
    public Object getProxy(){

        // 参数为调用者的类，指定接口的类或者接口，调用者

        return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
        //  Proxy.newProxyInstance 执行时会生成一个创建出一个类$Proxy0，此类中调用invoke
    }


    // 处理代理实例，并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        SeeHouse();

        System.out.println("invoke方法" + proxy.getClass().getName());
        // 动态代理的本质，就是通过反射机制实现的
        Object result = method.invoke(rent, args);  // 执行 被代理对象的方法，，invoke
        System.out.println("invoke result--"  + result.getClass().getName());
        Tip();

        return result;
    }


    public void SeeHouse(){
        System.out.println("看房子");
    }

    public void Tip(){
        System.out.println("收小费");
    }


}
